package com.example.chapter07_server.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * 数据库帮助类，继承自SQLiteOpenHelper
 * 作用：负责用户信息数据库（user.db）的创建、版本管理，以及提供数据库操作的入口
 * 采用单例模式设计，避免频繁创建数据库连接导致的资源浪费
 */
public class UserDBHelper extends SQLiteOpenHelper {

    // 数据库名称：SQLite数据库文件的名称，存储在/data/data/包名/databases/目录下
    private static final String DB_NAME = "user.db";
    // 表名：用户信息表的名称，用于后续CRUD操作时指定操作的表
    public static final String TABLE_NAME = "user_info";
    // 数据库版本号：用于数据库升级（当结构变更时，通过提高版本号触发onUpgrade方法）
    private static final int DB_VERSION = 1;
    // 单例实例：保证整个应用中只有一个UserDBHelper实例，避免多实例操作数据库导致的冲突
    private static UserDBHelper mHelper = null;

    /**
     * 私有构造方法
     * 目的：禁止外部直接通过new创建实例，确保只能通过getInstance()获取单例
     * @param context 上下文对象，用于创建数据库文件（建议使用Application Context避免内存泄漏）
     */
    private UserDBHelper(Context context) {
        // 调用父类构造方法：参数分别为上下文、数据库名、游标工厂（null表示使用默认）、数据库版本
        super(context, DB_NAME, null, DB_VERSION);
    }

    /**
     * 单例模式：获取数据库帮助类的唯一实例
     * 线程安全说明：此处未加同步锁，简单场景可用；高并发场景需添加synchronized保证线程安全
     * @param context 上下文对象（外部调用时建议传入getApplicationContext()）
     * @return UserDBHelper的唯一实例
     */
    public static UserDBHelper getInstance(Context context) {
        // 若实例未创建，则创建新实例（双重校验锁的简化版，适合基础场景）
        if (mHelper == null) {
            mHelper = new UserDBHelper(context);
        }
        return mHelper;
    }

    /**
     * 数据库第一次创建时调用（仅在数据库文件不存在时执行一次）
     * 作用：执行建表语句，初始化数据库结构
     * @param db 数据库操作实例，通过该实例执行SQL语句
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 建表SQL语句：创建用户信息表，包含以下字段
        // _id：主键，自增（AUTOINCREMENT），非空（NOT NULL），用于唯一标识每条记录
        // name：用户名，字符串类型（VARCHAR），非空
        // age：年龄，整数类型（INTEGER），非空
        // height：身高，长整数类型（LONG），非空（单位可自定义，如厘米）
        // weight：体重，浮点类型（FLOAT），非空（单位可自定义，如千克）
        // married：婚姻状态，整数类型（INTEGER），非空（约定0表示未婚，1表示已婚）
        String sql = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" +
                "_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
                " name VARCHAR NOT NULL," +
                " age INTEGER NOT NULL," +
                " height LONG NOT NULL," +
                " weight FLOAT NOT NULL," +
                " married INTEGER NOT NULL);";
        // 执行SQL语句创建表
        db.execSQL(sql);
    }

    /**
     * 数据库版本升级时调用（当DB_VERSION提高，且数据库文件已存在时触发）
     * 作用：处理表结构变更（如新增字段、修改类型等）
     * 当前版本为1，暂未实现升级逻辑；若后续升级，需在此处编写老版本到新版本的迁移代码
     * @param db 数据库操作实例
     * @param oldVersion 旧版本号
     * @param newVersion 新版本号
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 示例升级逻辑（当前未启用）：
        // if (oldVersion < 2) {
        //     // 版本2新增字段：如phone
        //     db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN phone VARCHAR;");
        // }
    }


}